/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package ConexionBD;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.ArrayList;
import java.util.StringTokenizer;
/**
 *
 * @author User
 */
public class ClienteSQL {
    
    private String consulta;
    private Socket socket;
    private InputStream entrada;
    private OutputStream salida;
    private DataOutputStream salidaDatos;
    private DataInputStream entradaDeDatos;

    public ClienteSQL() {
       
    }
    
    public void realizarConexionServidor(){
        try {
            socket = new Socket ("localhost", 2014);
        } catch (IOException ex) {
            System.out.println("No se pudo establecer conexion al servidor por el socket 2014");
        }
    }
    
    // Este metodo se encarga de recibir como parametro una consulta sql y retorna un
    // ArrayList que se comporta igual que una estructura de un ResultSet
    
    // realizarConsultaBD retorna un ArrayList semejante al comportamiento de un ResultSet
    // es decir será un arreglo de arreglos, donde cada arreglo que esta dentro, representará 
    // cada fila del resultado de la consulta sql.
    public ArrayList realizarConsultaBD(String consulta){
        
        this.consulta = consulta;
        
        try {
            
            entrada = socket.getInputStream();
            salida = socket.getOutputStream();

            salidaDatos = new DataOutputStream (salida);
            
            //Enviamos la consulta al servidor por medio del socket
            salidaDatos.writeUTF(consulta);
           
            return recibirConsultaBD();
            
        } catch (Exception ex) {
            System.out.println("Ocurrio Un Error Al Tratar de Enviar La Consulta Al Servidor");
        }
        ArrayList arrayNull=null;
        return arrayNull;
        
    }
    
    public ArrayList recibirConsultaBD(){
        try {
            entradaDeDatos = new DataInputStream (entrada);
            String consultaRecibida = entradaDeDatos.readUTF();
            System.out.println("La Consulta recibida es: "+consultaRecibida);
            return organizarComoResultSet(consultaRecibida);
        } catch (IOException ex) {
            System.out.println("Ocurrio Un Error Al Tratar de Recibir La Consulta Del Servidor");
        }
        ArrayList arrayNull=null;
        return arrayNull;
    }
    
    // organizarComoResultSet retorna un ArrayList semejante al comportamiento de un ResultSet
        // es decir será un arreglo de arreglos, donde cada arreglo que esta dentro, representará 
        // cada fila del resultado de la consulta sql.
    public ArrayList organizarComoResultSet(String consultaRecibida){
        
        StringTokenizer tokens1 = new StringTokenizer(consultaRecibida,"\n");
        ArrayList arregloFilas = new ArrayList();

            while(tokens1.hasMoreTokens()){
                ArrayList arregloAtributos = new ArrayList();
                
                StringTokenizer tokens2 = new StringTokenizer(tokens1.nextToken());
                while(tokens2.hasMoreTokens()){
                    arregloAtributos.add(tokens2.nextToken());
                }
                
                arregloFilas.add(arregloAtributos);
                
            }
            
            return arregloFilas;
    
    }
    
    public String getConsulta() {
        return consulta;
    }

    public void setConsulta(String consulta) {
        this.consulta = consulta;
    }
    
}
